home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / fish / 726-750 / 742 / rkrm_lib2 / rkrm_lib2.lha / Exec_Library / Interrupts / rbf.c < prev    next >
C/C++ Source or Header  |  1992-09-03  |  7KB  |  163 lines

  1. ;/* rbf.c - Execute me to compile me with SAS C 5.10
  2. LC -d0 -b1 -cfistq -v -y -j73 rbf.c
  3. Blink FROM LIB:c.o,rbf.o,rbfhandler.o TO rbf LIBRARY LIB:LC.lib,LIB:Amiga.lib
  4. quit ;
  5.  
  6. ** rbf.c - serial receive buffer full interrupt handler example.
  7. ** Must be linked with assembler handler rbfhandler.o
  8. **
  9. ** To receive characters, this example requires ASCII serial input
  10. ** at your Amiga's current serial hardware baud rate (ie. 9600 after
  11. ** reboot, else last baud rate used)
  12.  
  13.  
  14. Copyright (c) 1992 Commodore-Amiga, Inc.
  15.  
  16. This example is provided in electronic form by Commodore-Amiga, Inc. for
  17. use with the "Amiga ROM Kernel Reference Manual: Libraries", 3rd Edition,
  18. published by Addison-Wesley (ISBN 0-201-56774-1).
  19.  
  20. The "Amiga ROM Kernel Reference Manual: Libraries" contains additional
  21. information on the correct usage of the techniques and operating system
  22. functions presented in these examples.  The source and executable code
  23. of these examples may only be distributed in free electronic form, via
  24. bulletin board or as part of a fully non-commercial and freely
  25. redistributable diskette.  Both the source and executable code (including
  26. comments) must be included, without modification, in any copy.  This
  27. example may not be published in printed form or distributed with any
  28. commercial product.  However, the programming techniques and support
  29. routines set forth in these examples may be used in the development
  30. of original executable software products for Commodore Amiga computers.
  31.  
  32. All other rights reserved.
  33.  
  34. This example is provided "as-is" and is subject to change; no
  35. warranties are made.  All use is at your own risk. No liability or
  36. responsibility is assumed.
  37. */
  38.  
  39. #include <exec/execbase.h>
  40. #include <exec/memory.h>
  41. #include <exec/interrupts.h>
  42. #include <resources/misc.h>
  43. #include <hardware/custom.h>
  44. #include <hardware/intbits.h>
  45. #include <dos/dos.h>
  46.  
  47. #include <clib/exec_protos.h>
  48. #include <clib/misc_protos.h>
  49.  
  50. #include <stdio.h>
  51. #include <string.h>
  52.  
  53. #ifdef LATTICE
  54. int CXBRK(void)  { return(0); }  /* Disable Lattice CTRL/C handling */
  55. void chkabort(void) { return; }  /* really */
  56. #endif
  57.  
  58. #define BUFFERSIZE 256
  59.  
  60. extern void RBFHandler();   /* proto for asm interrupt handler */
  61. void main(void);
  62.  
  63. struct MiscResource *MiscBase;
  64. extern struct ExecBase *SysBase;
  65. extern struct Custom far custom;    /* defined in amiga.lib */
  66.  
  67. static UBYTE *allocname = "rbf-example";
  68.  
  69. struct RBFData {
  70.     struct Task *rd_Task;
  71.     ULONG rd_Signal;
  72.     ULONG rd_BufferCount;
  73.     UBYTE rd_CharBuffer[BUFFERSIZE + 2];
  74.     UBYTE rd_FlagBuffer[BUFFERSIZE + 2];
  75.     UBYTE rd_Name[32];
  76. };
  77.  
  78. void main(void)
  79. {
  80.     struct RBFData *rbfdata;
  81.     UBYTE *currentuser;
  82.     BYTE signr;
  83.     struct Device *serdevice;
  84.     struct Interrupt *rbfint, *priorint;
  85.     BOOL priorenable;
  86.     ULONG signal;
  87.  
  88.     if (MiscBase = OpenResource("misc.resource"))
  89.     {
  90.         currentuser = AllocMiscResource(MR_SERIALPORT, allocname);        /* Allocate the serial */
  91.         if (currentuser)                                                  /* port registers.     */
  92.         {
  93.             printf("serial hardware allocated by %s. Trying to remove it\n",
  94.                    currentuser);                                         /* Hey! someone got it! */
  95.             Forbid();
  96.             if (serdevice = (struct Device *)FindName(&SysBase->DeviceList, currentuser))
  97.                 RemDevice(serdevice);
  98.             Permit();
  99.  
  100.             currentuser = AllocMiscResource(MR_SERIALPORT, allocname);          /* and try again */
  101.         }
  102.         if (currentuser == NULL)
  103.         {                                                                      /* Get the serial */
  104.             currentuser = AllocMiscResource(MR_SERIALBITS, allocname);         /* control bits.  */
  105.             if (currentuser)
  106.             {
  107.                 printf("serial control allocated by %s\n", currentuser);            /* Give up. */
  108.                 FreeMiscResource(MR_SERIALPORT);
  109.             }
  110.             else
  111.             {                                                                  /* Got them both. */
  112.                 printf("serial hardware allocated\n");
  113.                 if ((signr = AllocSignal(-1)) != -1)          /* Allocate a signal bit for the   */
  114.                 {                                             /* interrupt handler to signal us. */
  115.                     if (rbfint = AllocMem(sizeof(struct Interrupt), MEMF_PUBLIC|MEMF_CLEAR))
  116.                     {
  117.                         if (rbfdata = AllocMem(sizeof(struct RBFData), MEMF_PUBLIC|MEMF_CLEAR))
  118.                         {
  119.                             rbfdata->rd_Task = FindTask(NULL);        /* Init rfbdata structure. */
  120.                             rbfdata->rd_Signal = 1L << signr;
  121.  
  122.                             rbfint->is_Node.ln_Type = NT_INTERRUPT;      /* Init interrupt node. */
  123.                             strcpy(rbfdata->rd_Name, allocname);
  124.                             rbfint->is_Node.ln_Name = rbfdata->rd_Name;
  125.                             rbfint->is_Data = (APTR)rbfdata;
  126.                             rbfint->is_Code = RBFHandler;
  127.                                                                         /* Save state of RBF and */
  128.                             priorenable = custom.intenar & INTF_RBF ? TRUE : FALSE; /* interrupt */
  129.                             custom.intena = INTF_RBF;                             /* disable it. */
  130.                             priorint = SetIntVector(INTB_RBF, rbfint);
  131.  
  132.                             if (priorint) printf("replaced the %s RBF interrupt handler\n",
  133.                                                  priorint->is_Node.ln_Name);
  134.                             printf("enabling RBF interrupt\n");
  135.                             custom.intena = INTF_SETCLR | INTF_RBF;
  136.  
  137.                             printf("waiting for buffer to fill up. Use CTRL-C to break\n");
  138.                             signal = Wait(1L << signr | SIGBREAKF_CTRL_C);
  139.  
  140.                             if (signal & SIGBREAKF_CTRL_C) printf(">break<\n");
  141.                             printf("Character buffer contains:\n%s\n", rbfdata->rd_CharBuffer);
  142.  
  143.                             custom.intena = INTF_RBF;               /* Restore previous handler. */
  144.                             SetIntVector(INTB_RBF, priorint);
  145.                                                                   /* Enable it if it was enabled */
  146.                             if (priorenable) custom.intena = INTF_SETCLR|INTF_RBF;    /* before. */
  147.  
  148.                             FreeMem(rbfdata, sizeof(struct RBFData));
  149.                         }
  150.                         else  printf("can't allocate memory for rbf data\n");
  151.                         FreeMem(rbfint, sizeof(struct Interrupt));
  152.                     }
  153.                     else printf("can't allocate memory for interrupt structure\n");
  154.                     FreeSignal(signr);
  155.                 }
  156.                 else printf("can't allocate signal\n");
  157.  
  158.                 FreeMiscResource(MR_SERIALBITS);   /* release serial hardware */
  159.                 FreeMiscResource(MR_SERIALPORT);
  160.             }
  161.         }
  162.     } /* There is no 'CloseResource()' function */
  163. }